package com.niit.service.impl;

import com.niit.dao.CartItemMapper;
import com.niit.pojo.CartItem;
import com.niit.pojo.Product;
import com.niit.service.CartItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class CartItemServiceImpl implements CartItemService {
    @Autowired
    private CartItemMapper cartItemMapper;

    @Override
    public List<CartItem> queryCartItem(CartItem cartItem) {
        List<CartItem> queriedCartItem = cartItemMapper.queryCartItem(cartItem);
        return queriedCartItem;
    }

    @Override
    public void addToCart(int uid, int pid, int quantity) {
        CartItem cartItem = cartItemMapper.findCartItemByUidAndPid(uid, pid);
        if(cartItem != null){
            cartItemMapper.updateCartItem(uid, pid, quantity);
        }else {
            cartItemMapper.insertCartItem(uid, pid, quantity);
        }
    }

    @Override
    public boolean deleteCartItem(int uid, int pid) {
        int rowsDeleted = cartItemMapper.deleteCartItem(uid, pid);
        return rowsDeleted > 0;
    }

    @Override
    public Map<String, Object> checkout(int uid, @Nullable Integer pid) {
        Map<String, Object> result = new HashMap<>();
        BigDecimal total;
        List<CartItem> cartItems = new ArrayList<>();
        try {
            if(pid == null){
                // 获取购物车数据
                CartItem param = new CartItem();
                param.setUid(uid);
                cartItems = cartItemMapper.queryCartItem(param);

                // 验证购物车是否为空
                if (cartItems == null || cartItems.isEmpty()) {
                    result.put("code", 0);
                    result.put("message", "购物车为空");
                    return result;
                }
                total = cartItems.stream()
                        .map(item -> item.getProduct().getPrice()
                                .multiply(BigDecimal.valueOf(item.getQuantity())))
                        .reduce(BigDecimal.ZERO, BigDecimal::add);

                result.put("code", 1);
            }else {
                CartItem param = cartItemMapper.findCartItemByUidAndPid(uid,pid);
                cartItems.add(param);
                total = param.getProduct().getPrice()
                        .multiply(BigDecimal.valueOf(param.getQuantity()));

                result.put("code", 2);
            }
            result.put("totalPrice", total);
            result.put("cartItems", cartItems);
        } catch (Exception e) {
            result.put("code", 0);
            result.put("message", "在获取购物车时处理失败：" + e.getMessage());
        }
        return result;
    }

}
